#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 100 //TAMANHO MÁXIMO DO TOKEN
#include "biblioteca.h"

//vetores de string que serão usados na pesquisa
char vetor2[5][10] = {"DO","IF","OF","OR","TO"};
char vetor3[7][10] = {"AND","DIV","END","FOR","MOD","NOT", "VAR"};
char vetor4[6][10] = {"ELSE","GOTO","THEN","TYPE","REAL","CHAR"}; 
char vetor5[6][10] = {"BEGIN","ARRAY","CONST","LABEL","UNTIL","WHILE"}; 
char outros[8][10] = {"FUNCTION","PROCEDURE","PROGRAM","RECORD","REPEAT","INTEGER","BOOLEAN","STRING"};

void upper_string(char *string){
	while(*string){
		if ( *string >= 'a' && *string <= 'z' ){
			*string = *string - 32;
		}
		string++;
	}
}

/**
 * Pesquisa num dos vetores declarados acima se há a ocorreĉencia da palavra
 * quantidade serve para indicar quantos itens tem na matriz
 */

int pesquisarNoVetor(char string[],char vetor[][10], int quantidade){
	int i, retorno = 0;
	
	//faz a cópia da string passada como parâmetro
	char *copia = (char *) malloc(strlen(string)*sizeof(char));
	strcpy(copia, string);
	upper_string(copia);
	
	//verifica se a string passada como parametro está no vetor de strings
	for(i=0; i<quantidade; i++){
		if(strcmp(copia, vetor[i])== 0){
			retorno = 1;
			break;
		}
	}
	
	//libera a cópia
	free(copia);
	
	return retorno;
}

/**
 * verifica se a string passada no parâmetro é uma palavra reservada, consultando nos vetores declarados acima
 */
int isPalavraReservada(char string[]){
	int retorno = 0;
	switch((int)strlen(string)){
		case 2:
			retorno = pesquisarNoVetor(string, vetor2, 5);
			break;
		
		case 3:
			retorno = pesquisarNoVetor(string, vetor3, 7);
			break;
		
		case 4:
			retorno = pesquisarNoVetor(string, vetor4, 6);
			break;
			
		case 5:
			retorno = pesquisarNoVetor(string, vetor5, 6);
			break;
			
		default: 
			retorno = pesquisarNoVetor(string, outros, 8);
			break;
	}	
	
	return retorno;
}

int variavel(char string[]){
	int estadoAtual = 1, underline = 0; //underline servirá para alertar se o primeiro caracter é um underline
	int proximoEstado = 2;
	int i = 0, cont = 0;
	char token[max];
	char aux, c;

	//LENDO BUFFER
	c = lerChar();
    
	if(c == '_') underline = 1; //caso o primeiro caracter seja "_", não é necessário verificar se é palavra reservada
	
	/**
	 * a função "isalnum" verifica se um char é alfanumérico. Então não é necessário verificar se o char está entre A e Z
	 * basta verificar se ele é um alfanumérico ou "_"
	 * 
	 * É uma boa pratica usar o cont++ ao inver do cont = cont + 1, fica mais legível
	 */
	while (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))||(c == '_')|| isalnum(c)){
		if(buffer.ind_buffer > 49) encherBuffer();
		cont = cont + 1;
		token[i] = c;
		i++;
		c = lerChar();
	}
	
	token[i] = '\0';
	
	if(!underline && isPalavraReservada(token)){
		upper_string(token);
		fprintf(saida, "Palavra reservada %s identificada\n", token);
        strcpy(string, token);
        buffer.ind_buffer--;
		return 2; //codigo 2: retorno de uma palavra reservada
	}
	else{
		 fprintf(saida,"Variavel %s identificada\n", token);
		 strcpy(string, token);
         buffer.ind_buffer--;
         return 3;  //codigo 3: retorno de uma variavel 
	}
}
